#ifndef _XX_YY_BMOCK_ARGUMENT
#define _XX_YY_BMOCK_ARGUMENT
#include "bmock_in_arg_val.hpp"
#include "bmock_out_arg_val.hpp"
#include "detail/bmock_ignore_arg_val.hpp"
#include "bmock_out_ptr_arg_val.hpp"
#include "bmock_out_str_arg_val.hpp"
#include "bmock_out_raw_mem_ptr.hpp"
#include "bmock_in_out_str_arg_val.hpp"
#include "bmock_in_out_ptr_arg_val.hpp"
#include "bmock_in_out_raw_mem_ptr.hpp"
#include "detail/bmock_in_mem_func_ptr.hpp"

namespace bmock {
	struct argument {
		argument(arg_val *const v);
		~argument() {}
		std::string get_name() const { return value_->get_name(); }
		bool        validate(const arg_checker &chk,const arg_val_str &v) const;
		bool		validate_no_msg(const arg_checker &chk, const arg_val_str &v) const;
		bool        update(const arg_checker &chk,const arg_val_str &v) const;
		arg_val_str get_value(const arg_checker &chk) const;
		void        print(std::ostream &os) const;
	private:
		boost::shared_ptr<arg_val> value_;
	};
};
namespace std {
	std::ostream &operator <<(std::ostream &os,const bmock::argument &arg);
}

#include "bmock_expand_arg.hpp"

#endif
